#include "listaHD.h"
#include <pthread.h>

void HDlista_init(tListaHD* l){
	l->Actual=NULL;
	l->Primero=NULL;
	l->Ultimo=NULL;
	l->length=0;
	pthread_mutex_init(&l->sem,NULL);
}
void HDlista_push(tListaHD* l, Disco d){
	tNodoHD* new= (tNodoHD* ) malloc(sizeof(tNodoHD));
	new->Dato=d;

pthread_mutex_lock(&l->sem);
//wait(s)
	if (l->Primero==NULL){
		new->Ant=NULL;
		new->Sig=NULL;

		l->Primero=new;
		l->Actual=new;
		l->Ultimo=new;
	}else{
		tNodoHD* aux= l->Ultimo;
		//aux->Ant=
		aux->Sig=new;

		new->Ant=aux;
		new->Sig=NULL;

		//l->Primero=new;
		l->Actual=new;
		l->Ultimo=new;
	}
	l->length++;
//signal(s)
pthread_mutex_unlock(&l->sem);

}

void HDlista_popNodo(tListaHD* l, tNodoHD* n){
//wait(s)
pthread_mutex_lock(&l->sem);
	tNodoHD* a=n->Ant;
	tNodoHD* s=n->Sig;
	if ((a!=NULL) && (s!=NULL)){
		a->Sig=s;
		s->Ant=a;
	}
	if (a==NULL){//primero
	  	l->Primero=s;
	  	if (s!=NULL)
	  		s->Ant=NULL;
	}
	if (s==NULL){//ultimo
		l->Ultimo=a;
		if (a!=NULL)
			a->Sig=NULL;
	}


	l->length--;
	free(n);

//signal(s)
pthread_mutex_unlock(&l->sem);

}

void HDlista_getfirst(tListaHD* l, tNodoHD** n){
	pthread_mutex_lock(&l->sem);
	*n=l->Primero;
	pthread_mutex_unlock(&l->sem);
}

void HDlista_getLast(tListaHD* l, tNodoHD** n){
	pthread_mutex_lock(&l->sem);
	*n=l->Ultimo;
	pthread_mutex_unlock(&l->sem);
}

void HDlista_getNext(tListaHD* l, tNodoHD** n){
	pthread_mutex_lock(&l->sem);
	*n=(*n)->Sig;
	pthread_mutex_unlock(&l->sem);
}
